use crate::utils::config::ConfigMinigrep;
use ansi_term::Colour;
use std::io::ErrorKind;
use std::path::Path;
use std::{
    fs::{self, File},
    io::{self, BufRead},
};

fn grep_from_file(query: &str, filename: &str) -> Result<(), io::Error> {
    let file = File::open(filename)?;
    let reader = io::BufReader::new(file);
    for line in reader.lines() {
        match line {
            // line是字符串
            Ok(line) => {
                if line.contains(query) {
                    println!(
                        "[{}] {}",
                        filename,
                        line.replace(
                            query,
                            &Colour::RGB(0, 255, 0).bold().paint(query).to_string()
                        )
                    );
                }
            }
            Err(err) => {
                match err.kind() {
                    ErrorKind::InvalidData => {
                        break
                    },
                    _ => todo!(),
                };
                // println!("[{}] err = {} | {}", filename, err.kind(), err);
            }
        }
    }

    Ok(())
}
fn is_dir<P: AsRef<Path>>(path: P) -> bool {
    path.as_ref()
        .metadata()
        .map(|m| m.is_dir())
        .unwrap_or(false)
}
fn grep_from_dir(query: &str, dir: &str) {
    for entry in fs::read_dir(&dir).unwrap() {
        if let Ok(entry) = entry {
            // 可以在这里处理目录中的文件和子目录，例如打印文件名
            // println!("{} {}", entry.file_name().to_string_lossy(), entry.path().to_string_lossy());

            if let Some(file) = entry.path().to_str() {
                if is_dir(file) {
                    // 如果是目录，递归调用 grep_from_dir 函数
                    grep_from_dir(query, &entry.path().to_string_lossy());
                } else {
                    let _ = grep_from_file(query, &file);
                }
            }
        }
    }
}
pub fn grep_from_conf(conf: ConfigMinigrep) -> Result<(), io::Error> {
    for file in conf.file_arr {
        if is_dir(&file) {
            grep_from_dir(&conf.query, &file);
        } else {
            grep_from_file(&conf.query, &file)?;
        }
    }

    Ok(())
}
